package me.dengfengdecao.android.photogallery;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.preference.PreferenceManager;
import android.util.Log;

import java.util.ArrayList;

/**
 * 后台检索图片的后台服务
 */
public class PollService extends IntentService {

    private static final String TAG = "PollService";

    private static final int POLL_INTERVAL = 1000 * 60 * 5; // 间隔5分钟
    public static final String PREF_IS_ALARM_ON = "isAlarmOn";  // 定时器状态
    public static final String ACTION_SHOW_NOTIFICATION = "me.dengfengdecao.android.photogallery.SHOW_NOTIFICATION"; // broadcast的action
    public static final String PERM_PRIVATE = "me.dengfengdecao.android.photogallery.PRIVATE"; // 应用的私有权限

    public PollService() {
        super(TAG);
    }

    @TargetApi(android.os.Build.VERSION_CODES.JELLY_BEAN)
    @SuppressLint("CommitPrefEdits")
    @SuppressWarnings("deprecation")
    @Override
    protected void onHandleIntent(Intent intent) {
        // 使用ConnectivityManager确认网络连接是否可用
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        boolean isNetWorkAvailable = cm.getBackgroundDataSetting() && cm.getActiveNetworkInfo() != null;
        if (!isNetWorkAvailable) return;

        // 从默认SharedPreferences中获取当前查询结果以及上一次结果URL；
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String query = prefs.getString(NetFetcher.PREF_SEARCH_QUERY, null);
        String lastResultUrl = prefs.getString(NetFetcher.PREF_LAST_RESULT_URL, null);

        // 使用NetFetchr类获取最新结果集；
        ArrayList<GalleryItem> items;
        if (query != null) {
            items = new NetFetcher().search(query);
        } else {
            items = new NetFetcher().fetchItems();
        }

        // 如果有结果返回，抓取结果的第一条；
        if (items.size() == 0) return;

        String resultUrl = items.get(0).getUrl();
        // 检查确认是否不同于上一次结果Url；
        if (!resultUrl.equals(lastResultUrl)) {
            Log.d(TAG, "onHandleIntent 获得一个新的结果" + resultUrl);

            // 添加通知信息，用户可向下滑动屏幕读取
            Resources r = getResources();
            Intent i = new Intent(PollService.this, PhotoGalleryActivity.class);    // 点击消息条时启动PhotoGalleryActivity
            PendingIntent pendingIntent = PendingIntent.getService(this, 0, i, 0);

            // 首次显示通知信息时，在状态栏上显示的ticker text；
            // ticker text消失后，在状态栏上显示的图标；
            // 代表通知信息自身，在通知抽屉中显示的视图；
            // 用户点击抽屉中的通知信息，触发PendingIntent。
            Notification notification = new Notification.Builder(this)
                    .setTicker(r.getString(R.string.new_pictures_title))
                    .setSmallIcon(android.R.drawable.ic_menu_report_image)
                    .setContentTitle(r.getString(R.string.new_pictures_title))
                    .setContentText(r.getString(R.string.new_pictures_text))
                    .setContentIntent(pendingIntent)  // 发送PendingIntent
                    .setAutoCancel(true)  // 用户点击Notification消息后，将该消息从消息抽屉中删除
                    .build();

            // 实现让PollService通知新结果信息给用户
//            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//            notificationManager.notify(0, notification);
//            // 发送自己带有权限的broadcast intent
//            // 其他应用必须使用同样的权限才能接收我们发送的intent
//            sendBroadcast(new Intent(ACTION_SHOW_NOTIFICATION), PERM_PRIVATE);

            showBackgroundNotification(0, notification);
        } else {
            Log.d(TAG, "onHandleIntent 返回一个旧的结果" + resultUrl);
        }

        // 将第一条结果保存回SharedPreferences。commit()将会立即提交
        prefs.edit().putString(NetFetcher.PREF_LAST_RESULT_URL, resultUrl).commit();
    }

    // 设置定时器
    public static void setServiceAlarm(Context c, boolean isOn) {
        Intent i = new Intent(c, PollService.class);
        // 使用PendingIntent打包intent告诉系统启动PollService服务，
        PendingIntent pendingIntent = PendingIntent.getService(c, 0, i, 0);
        // 将其发送给系统中的其他部件，如AlarmManager
        AlarmManager alarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);

        // 设置或取消定时器
        if (isOn) {
            alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), POLL_INTERVAL, pendingIntent);
        } else {
            alarmManager.cancel(pendingIntent);
            pendingIntent.cancel();
        }

        // 存储定时器状态
        PreferenceManager.getDefaultSharedPreferences(c)
                .edit()
                .putBoolean(PREF_IS_ALARM_ON, isOn)
                .commit();
    }

    // 判断定时器的启停状态
    public static boolean isServiceAlarmOn(Context c) {
        Intent i = new Intent(c, PollService.class);
        // FLAG_NO_CREATE,该标志表示如果PendingIntent不存在，则返回null值，而不是创建它。
        PendingIntent pendingIntent = PendingIntent.getService(c, 0, i, PendingIntent.FLAG_NO_CREATE);
        return pendingIntent != null;
    }

    // 发送有序的Broadcast
    void showBackgroundNotification(int requestCode, Notification notification) {
        Intent i = new Intent(ACTION_SHOW_NOTIFICATION);
        i.putExtra("REQUEST_CODE", requestCode);
        i.putExtra("NOTIFICATION", notification);

        sendOrderedBroadcast(i, PERM_PRIVATE, null, null, Activity.RESULT_OK, null, null);
    }
}
